{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# K Means Clustering"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Steps involved in K Means Clustering\n",
    "1. Initialize two examples of the training data set as Centroids using Kmeans++ or random initialization\n",
    "2. Loop over the num of iterations to perform the clustering.\n",
    "   2.a. For each training example compute the euclidian distance from the centroid and assign the cluster\n",
    "   based on the minimal distance.\n",
    "   2.b Adjust the centroid of each cluster by taking the average of all the training examples which belonged \n",
    "   to that cluster on the basis of the computations performed in step 2.a"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "#import libraries\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import pandas as pd\n",
    "import random as rd"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "# -*- coding: utf-8 -*-\n",
    "\"\"\"\n",
    "Created on Wed Dec 12 16:35:06 2018\n",
    "\n",
    "@author: purandur\n",
    "\"\"\"\n",
    "import numpy as np\n",
    "import random as rd\n",
    "class Kmeans:\n",
    "    def __init__(self,X,K):\n",
    "        self.X=X\n",
    "        self.Output={}\n",
    "        self.Centroids=np.array([]).reshape(self.X.shape[1],0)\n",
    "        self.K=K\n",
    "        self.m=self.X.shape[0]\n",
    "        \n",
    "    def kmeanspp(self,X,K):\n",
    "        i=rd.randint(0,X.shape[0])\n",
    "        Centroid_temp=np.array([X[i]])\n",
    "        for k in range(1,K):\n",
    "            D=np.array([]) \n",
    "            for x in X:\n",
    "                D=np.append(D,np.min(np.sum((x-Centroid_temp)**2)))\n",
    "            prob=D/np.sum(D)\n",
    "            cummulative_prob=np.cumsum(prob)\n",
    "            r=rd.random()\n",
    "            i=0\n",
    "            for j,p in enumerate(cummulative_prob):\n",
    "                if r<p:\n",
    "                    i=j\n",
    "                    break\n",
    "            Centroid_temp=np.append(Centroid_temp,[X[i]],axis=0)\n",
    "        return Centroid_temp.T\n",
    "    \n",
    "    def fit(self,n_iter):\n",
    "        #randomly Initialize the centroids\n",
    "        self.Centroids=self.kmeanspp(self.X,self.K)\n",
    "        \n",
    "        \"\"\"for i in range(self.K):\n",
    "            rand=rd.randint(0,self.m-1)\n",
    "            self.Centroids=np.c_[self.Centroids,self.X[rand]]\"\"\"\n",
    "        \n",
    "        #compute euclidian distances and assign clusters\n",
    "        for n in range(n_iter):\n",
    "            EuclidianDistance=np.array([]).reshape(self.m,0)\n",
    "            for k in range(self.K):\n",
    "                tempDist=np.sum((self.X-self.Centroids[:,k])**2,axis=1)\n",
    "                EuclidianDistance=np.c_[EuclidianDistance,tempDist]\n",
    "            C=np.argmin(EuclidianDistance,axis=1)+1\n",
    "            #adjust the centroids\n",
    "            Y={}\n",
    "            for k in range(self.K):\n",
    "                Y[k+1]=np.array([]).reshape(2,0)\n",
    "            for i in range(self.m):\n",
    "                Y[C[i]]=np.c_[Y[C[i]],self.X[i]]\n",
    "        \n",
    "            for k in range(self.K):\n",
    "                Y[k+1]=Y[k+1].T\n",
    "            for k in range(self.K):\n",
    "                self.Centroids[:,k]=np.mean(Y[k+1],axis=0)\n",
    "                \n",
    "            self.Output=Y\n",
    "            \n",
    "    \n",
    "    def predict(self):\n",
    "        return self.Output,self.Centroids.T\n",
    "    \n",
    "    def WCSS(self):\n",
    "        wcss=0\n",
    "        for k in range(self.K):\n",
    "            wcss+=np.sum((self.Output[k+1]-self.Centroids[:,k])**2)\n",
    "        return wcss"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "dataset=pd.read_csv('Mall_Customers.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "X = dataset.iloc[:, [3, 4]].values"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>CustomerID</th>\n",
       "      <th>Age</th>\n",
       "      <th>Annual Income (k$)</th>\n",
       "      <th>Spending Score (1-100)</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>200.000000</td>\n",
       "      <td>200.000000</td>\n",
       "      <td>200.000000</td>\n",
       "      <td>200.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>100.500000</td>\n",
       "      <td>38.850000</td>\n",
       "      <td>60.560000</td>\n",
       "      <td>50.200000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>57.879185</td>\n",
       "      <td>13.969007</td>\n",
       "      <td>26.264721</td>\n",
       "      <td>25.823522</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>18.000000</td>\n",
       "      <td>15.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>50.750000</td>\n",
       "      <td>28.750000</td>\n",
       "      <td>41.500000</td>\n",
       "      <td>34.750000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>100.500000</td>\n",
       "      <td>36.000000</td>\n",
       "      <td>61.500000</td>\n",
       "      <td>50.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>150.250000</td>\n",
       "      <td>49.000000</td>\n",
       "      <td>78.000000</td>\n",
       "      <td>73.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>200.000000</td>\n",
       "      <td>70.000000</td>\n",
       "      <td>137.000000</td>\n",
       "      <td>99.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       CustomerID         Age  Annual Income (k$)  Spending Score (1-100)\n",
       "count  200.000000  200.000000          200.000000              200.000000\n",
       "mean   100.500000   38.850000           60.560000               50.200000\n",
       "std     57.879185   13.969007           26.264721               25.823522\n",
       "min      1.000000   18.000000           15.000000                1.000000\n",
       "25%     50.750000   28.750000           41.500000               34.750000\n",
       "50%    100.500000   36.000000           61.500000               50.000000\n",
       "75%    150.250000   49.000000           78.000000               73.000000\n",
       "max    200.000000   70.000000          137.000000               99.000000"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dataset.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "m=X.shape[0]\n",
    "n_iter=100"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "from Kmeans import Kmeans"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\purandur\\Anaconda3\\lib\\site-packages\\numpy\\core\\fromnumeric.py:2957: RuntimeWarning: Mean of empty slice.\n",
      "  out=out, **kwargs)\n",
      "C:\\Users\\purandur\\Anaconda3\\lib\\site-packages\\numpy\\core\\_methods.py:73: RuntimeWarning: invalid value encountered in true_divide\n",
      "  ret, rcount, out=ret, casting='unsafe', subok=False)\n"
     ]
    }
   ],
   "source": [
    "#to find optimum number of clusters use elbow method\n",
    "WCSS_array=np.array([])\n",
    "for K in range(1,11):\n",
    "    kmeans=Kmeans(X,K)\n",
    "    kmeans.fit(n_iter)\n",
    "    Output,Centroids=kmeans.predict()\n",
    "    wcss=0\n",
    "    for k in range(K):\n",
    "        wcss+=np.sum((Output[k+1]-Centroids[k,:])**2)\n",
    "    #WCSS_array=np.append(WCSS_array,kmeans.WCSS())\n",
    "    WCSS_array=np.append(WCSS_array,wcss)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "ename": "ValueError",
     "evalue": "x and y must have same first dimension, but have shapes (10,) and (0,)",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mValueError\u001b[0m                                Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-17-9e7544a3b970>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[0;32m      1\u001b[0m \u001b[0mK_array\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0marange\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m11\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 2\u001b[1;33m \u001b[0mplt\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mplot\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mK_array\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mWCSS_array\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m      3\u001b[0m \u001b[0mplt\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mxlabel\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'Number of Clusters'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      4\u001b[0m \u001b[0mplt\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mylabel\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'within-cluster sums of squares (WCSS)'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      5\u001b[0m \u001b[0mplt\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtitle\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'Elbow method to determine optimum number of clusters'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32m~\\Anaconda3\\lib\\site-packages\\matplotlib\\pyplot.py\u001b[0m in \u001b[0;36mplot\u001b[1;34m(*args, **kwargs)\u001b[0m\n\u001b[0;32m   3356\u001b[0m                       mplDeprecation)\n\u001b[0;32m   3357\u001b[0m     \u001b[1;32mtry\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 3358\u001b[1;33m         \u001b[0mret\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0max\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mplot\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m   3359\u001b[0m     \u001b[1;32mfinally\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   3360\u001b[0m         \u001b[0max\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_hold\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mwashold\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32m~\\Anaconda3\\lib\\site-packages\\matplotlib\\__init__.py\u001b[0m in \u001b[0;36minner\u001b[1;34m(ax, *args, **kwargs)\u001b[0m\n\u001b[0;32m   1853\u001b[0m                         \u001b[1;34m\"the Matplotlib list!)\"\u001b[0m \u001b[1;33m%\u001b[0m \u001b[1;33m(\u001b[0m\u001b[0mlabel_namer\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mfunc\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m__name__\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1854\u001b[0m                         RuntimeWarning, stacklevel=2)\n\u001b[1;32m-> 1855\u001b[1;33m             \u001b[1;32mreturn\u001b[0m \u001b[0mfunc\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0max\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m*\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m   1856\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1857\u001b[0m         inner.__doc__ = _add_data_doc(inner.__doc__,\n",
      "\u001b[1;32m~\\Anaconda3\\lib\\site-packages\\matplotlib\\axes\\_axes.py\u001b[0m in \u001b[0;36mplot\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m   1525\u001b[0m         \u001b[0mkwargs\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mcbook\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mnormalize_kwargs\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0m_alias_map\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1526\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1527\u001b[1;33m         \u001b[1;32mfor\u001b[0m \u001b[0mline\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_get_lines\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m   1528\u001b[0m             \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0madd_line\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mline\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1529\u001b[0m             \u001b[0mlines\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mline\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32m~\\Anaconda3\\lib\\site-packages\\matplotlib\\axes\\_base.py\u001b[0m in \u001b[0;36m_grab_next_args\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m    404\u001b[0m                 \u001b[0mthis\u001b[0m \u001b[1;33m+=\u001b[0m \u001b[0margs\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    405\u001b[0m                 \u001b[0margs\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0margs\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 406\u001b[1;33m             \u001b[1;32mfor\u001b[0m \u001b[0mseg\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_plot_args\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mthis\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    407\u001b[0m                 \u001b[1;32myield\u001b[0m \u001b[0mseg\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    408\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32m~\\Anaconda3\\lib\\site-packages\\matplotlib\\axes\\_base.py\u001b[0m in \u001b[0;36m_plot_args\u001b[1;34m(self, tup, kwargs)\u001b[0m\n\u001b[0;32m    381\u001b[0m             \u001b[0mx\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0my\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mindex_of\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mtup\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m-\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    382\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 383\u001b[1;33m         \u001b[0mx\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0my\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_xy_from_xy\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0my\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    384\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    385\u001b[0m         \u001b[1;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcommand\u001b[0m \u001b[1;33m==\u001b[0m \u001b[1;34m'plot'\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32m~\\Anaconda3\\lib\\site-packages\\matplotlib\\axes\\_base.py\u001b[0m in \u001b[0;36m_xy_from_xy\u001b[1;34m(self, x, y)\u001b[0m\n\u001b[0;32m    240\u001b[0m         \u001b[1;32mif\u001b[0m \u001b[0mx\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m!=\u001b[0m \u001b[0my\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    241\u001b[0m             raise ValueError(\"x and y must have same first dimension, but \"\n\u001b[1;32m--> 242\u001b[1;33m                              \"have shapes {} and {}\".format(x.shape, y.shape))\n\u001b[0m\u001b[0;32m    243\u001b[0m         \u001b[1;32mif\u001b[0m \u001b[0mx\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mndim\u001b[0m \u001b[1;33m>\u001b[0m \u001b[1;36m2\u001b[0m \u001b[1;32mor\u001b[0m \u001b[0my\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mndim\u001b[0m \u001b[1;33m>\u001b[0m \u001b[1;36m2\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    244\u001b[0m             raise ValueError(\"x and y can be no greater than 2-D, but have \"\n",
      "\u001b[1;31mValueError\u001b[0m: x and y must have same first dimension, but have shapes (10,) and (0,)"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "K_array=np.arange(1,11,1)\n",
    "plt.plot(K_array,WCSS_array)\n",
    "plt.xlabel('Number of Clusters')\n",
    "plt.ylabel('within-cluster sums of squares (WCSS)')\n",
    "plt.title('Elbow method to determine optimum number of clusters')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The idea is that we want a small WCSS, but that the WCSS tends to decrease toward 0 as we increase k (the WCSS is 0 when k is equal to the number of data points in the dataset, because then each data point is its own cluster, and there is no error between it and the center of its cluster). So our goal is to choose a small value of k that still has a low WCSS, and the elbow usually represents where we start to have diminishing returns by increasing k."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "#based on these observations we choose 5 as optimum number of clusters\n",
    "K=5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "kmeans=Kmeans(X,K)\n",
    "kmeans.fit(n_iter)\n",
    "Output,Centroids=kmeans.predict()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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wEHbmpoK2aq2BLUzQSnaVFbUERw8sJb0Wegy/fitjmU3IplwQ0xzgRuAp731zUnbuuDsaIYDE4Ej897GcqJQQ0y7e0s9LiDDft5yCXBY1q2tANKZgsfJTDzdOdudf0c2ZIpGmy7O0tSp7kcOdR5T5aIxAxeE4VGcYNicsn2TV/aoV88v8YgRhkABoapTVHUKLgzGEFX9kar+CBcio3exGhhH0pmCx8lMPOicVVU2VxqKTPcsncduQ4P7kZOdanr08K/bblz188EMYALux/cf/diJevUmYEIiO8I4ytXQOmHjVpzy3W7x6xwmeuTpthWboLbcc48Jh1D4eUankq7z39Dgho527HCft98en4ejLJnLTuEQhYSQiDYc/be//Y1zzjmHAw88kMMOO4wRI0bw3nvvRTw33H333Xz8cfTAENdddx1//OMf25S/+OKLnHZakeyEMtnB4vpIbwKTgeuBBcC/hbGhLfSSqx9ELqQzBQ9rJl4MM/lKNcUvGgkb+6CnsDbq8crshpSgvcF+EGdpcETETIuo6tmh27Bjxw4dOnSozpgxo6XsjTfe0Jdffjni1bQO7JfK9u3bIx/vhRde0FNPPTV0/Vz8IEL9urhhpfHecniYfYqxlFJA5EoRgmIa+aSYkW7jQokeUn8B8YmqdtbcXhmdVXV1qDY899xz+g//8A++226++Watr6/XAQMG6HXXXaeqqsuWLdNDDjlEv/e97+lhhx2mJ598sm7cuFEfeOAB3W233fSggw7SQYMG6caNG7W2tlanTJmixxxzjN533336xhtv6FFHHaUDBgzQM888Uz/99FNVVR0zZow+8MADqqr69NNP68EHH6zHHHOM/vCHP2wREC+++KIOGjRIBw0apIMHD9a///3voX7PsAIizBATntbwAPAIsE5EbNA0R4LM5MeMMdP4WNIe4iylEqvIrXfn4RgS+jiLFi3iiCOOaFP+zDPPsHTpUubMmcOCBQuYP38+L7/8MgBLly7lBz/4AW+//TZ77rknDz30EKNGjaK+vr4l6U8iumvnzp159dVXOeecc7jgggu46aabWLhwIQMGDGDKlCmtzrl582YuvvhinnjiCV555RX+9re/tWy75ZZb+MUvfsGCBQt45ZVXfKPH5kJGASEiPwQ+AZ7F5W74vfdp5ECQ4Upzc4VlsaskihnpNg7EySSPhbS1VorK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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "color=['red','blue','green','cyan','magenta']\n",
    "labels=['cluster1','cluster2','cluster3','cluster4','cluster5']\n",
    "for k in range(K):\n",
    "    plt.scatter(Output[k+1][:,0],Output[k+1][:,1],c=color[k],label=labels[k])\n",
    "plt.scatter(Centroids[:,0],Centroids[:,1],s=300,c='yellow',label='Centroids')\n",
    "plt.title('Clusters of customers')\n",
    "plt.xlabel('Annual Income (k$)')\n",
    "plt.ylabel('Spending Score (1-100)')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#lets implement the same algorithm using sklearn libraries\n",
    "# Using the elbow method to find the optimal number of clusters\n",
    "from sklearn.cluster import KMeans\n",
    "wcss = []\n",
    "for i in range(1, 11):\n",
    "    kmeans = KMeans(n_clusters = i, init = 'k-means++', random_state = 42)\n",
    "    kmeans.fit(X)\n",
    "    wcss.append(kmeans.inertia_)\n",
    "plt.plot(range(1, 11), wcss)\n",
    "plt.title('The Elbow Method')\n",
    "plt.xlabel('Number of clusters')\n",
    "plt.ylabel('WCSS')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Fitting K-Means to the dataset\n",
    "kmeans = KMeans(n_clusters = 5, init = 'k-means++', random_state = 42)\n",
    "y_kmeans = kmeans.fit_predict(X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Visualising the clusters\n",
    "plt.scatter(X[y_kmeans == 0, 0], X[y_kmeans == 0, 1], s = 100, c = 'red', label = 'Cluster 1')\n",
    "plt.scatter(X[y_kmeans == 1, 0], X[y_kmeans == 1, 1], s = 100, c = 'blue', label = 'Cluster 2')\n",
    "plt.scatter(X[y_kmeans == 2, 0], X[y_kmeans == 2, 1], s = 100, c = 'green', label = 'Cluster 3')\n",
    "plt.scatter(X[y_kmeans == 3, 0], X[y_kmeans == 3, 1], s = 100, c = 'cyan', label = 'Cluster 4')\n",
    "plt.scatter(X[y_kmeans == 4, 0], X[y_kmeans == 4, 1], s = 100, c = 'magenta', label = 'Cluster 5')\n",
    "plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s = 300, c = 'yellow', label = 'Centroids')\n",
    "plt.title('Clusters of customers')\n",
    "plt.xlabel('Annual Income (k$)')\n",
    "plt.ylabel('Spending Score (1-100)')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
